package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.NaturalezasDAO;
import py.com.alfa.escriba.persistence.dto.NaturalezasDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.NaturalezasService;

public class NaturalezasServiceImpl implements NaturalezasService{

  private NaturalezasDAO naturalezasDAO;


public void setNaturalezasDAO(NaturalezasDAO naturalezasDAO) {
	this.naturalezasDAO = naturalezasDAO;
}

@Override
public List<NaturalezasDTO> listNaturalezas(InvocationContext ic)
		throws ServiceException {
	List<NaturalezasDTO> naturalezas= naturalezasDAO.listNaturalezas(ic.getIdEscribano());
	return naturalezas;
}

@Override
public NaturalezasDTO getNaturalezas(Long id, InvocationContext ic)
		throws ServiceException {
    if (id == null || id <= 0)
        throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

      NaturalezasDTO naturaleza =  naturalezasDAO.getNaturalezasById(id);

      if (naturaleza == null)
        throw new ServiceException(ErrorCode.NO_DATA_FOUND,"naturalezas.not.found", id);

      return naturaleza;
}

@Override
public void deleteNaturalezas(Long id, InvocationContext ic)
		throws ServiceException {
    if (id == null || id <= 0)
        throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

	NaturalezasDTO naturaleza =  naturalezasDAO.getNaturalezasById(id);
	
    if (naturaleza == null)
	    	throw new ServiceException(ErrorCode.NO_DATA_FOUND,"naturalezas.not.found", id);

    try {
        naturalezasDAO.deleteNaturalezas(naturaleza);
    }
    catch (DataIntegrityViolationException e){
        throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "naturalezas.constraint.violation", id);
    }
	
}

@Override
public NaturalezasDTO updateNaturalezas(Long id, NaturalezasDTO dto,
		InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
        throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

      if (null == dto)
        throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

      if (id == null || id <= 0)
          throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

  	  NaturalezasDTO naturaleza =  naturalezasDAO.getNaturalezasById(id);
  	
      if (naturaleza == null)
  	    	throw new ServiceException(ErrorCode.NO_DATA_FOUND,"naturalezas.not.found", id);

      Utils.validarDTO(dto);

      naturalezasDAO.updateNaturalezas(dto);

      return dto;
}

@Override
public NaturalezasDTO createNaturalezas(NaturalezasDTO dto, InvocationContext ic)
		throws ServiceException {
    if (dto == null)
        throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

      try {

        Utils.validarDTO(dto);

        naturalezasDAO.createNaturalezas(dto);
      }
      catch (DuplicateKeyException e){
        throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "naturaleza.duplicate.key");
      }

      return dto;
}


}